package com.mswyt.utils.base;

import com.mswyt.utils.base.inter.IMsAssert;
import lombok.extern.slf4j.Slf4j;

import java.util.List;
import java.util.Map;

/**
 * @author mashuai
 * @ClassName: MsAssertUtils
 * @Description: 断言, 简化判空操作。
 */
@Slf4j
public class MsAssertUtils {

    //缓存异常类名称
    private static String beanNameCache = "";
    //缓存异常接口实现类
    private static IMsAssert iMsAssert = null;
    public static final String MSG = "参数值缺失，请联系管理员";

    /**
     * 检查所有类型是否为null，
     * 检查String！="",List、Map长度！=0，Boolean！=false
     *
     * @param o   任意类型的参数
     * @param msg 异常信息
     **/
    public static void objIsNull(Object o, String msg) {
        check(o, msg);
    }

    /**
     * 检验多个参数值是否为空。如果存在一个为空，则提示异常
     **/
    public static void objIsNulls(Object... o) {
        for (Object o1 : o) {
            check(o1, MSG);
        }
    }

    private static void check(Object o, String msg) {
        //传入对象为null抛异常
        if (null == o) {
            throwException(msg);
        }
        //string为""抛出异常
        if (o instanceof String) {
            if ("".equals(o))
                throwException(msg);
        }
        //list长度为0抛出异常
        if (o instanceof List) {
            if (((List) o).size() == 0)
                throwException(msg);
        }
        //map类型长度为0，抛出异常
        if (o instanceof Map) {
            if (((Map) o).size() == 0)
                throwException(msg);
        }
        //如果是Boolean类型，返回结果不是true抛出异常
        if (o instanceof Boolean) {
            if ((Boolean) o == false) {
                throwException(msg);
            }
        }
    }

    /**
     * 一般来说项目使用全局捕获异常
     *
     * @param msg
     * @return
     * @author mashuai
     */
    public static void throwException(String msg) {
        log.info("异常信息：" + msg);
        if (MsEmptyUtils.isEmpty(beanNameCache)) {
            String[] beanNames = MsIocUtils.getBeanNames(IMsAssert.class);
            beanNameCache = beanNames[0];
        }
        if (iMsAssert == null) {
            iMsAssert = (IMsAssert) MsIocUtils.getBean(beanNameCache, IMsAssert.class);
        }
        iMsAssert.throwMsg(msg);
    }

    /**
     * 内部异常，不对前台提示，只抛在控制台
     *
     * @param msg
     * @return
     * @author mashuai
     */
    public static void throwInnerException(String msg) {
        throw new RuntimeException(msg);
    }
}
